﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;
using Business;
using Business.Entity.Contabil.Pessoa;
using Business.Entity.Estoque.Produto;
using Business.Entity.Vendas.MovimentacaoCaixa.SubClass.LancamentoInicial;
using Business.Entity.Vendas.Pedido.ClassesRelacionadas;
using Business.Entity.Vendas.Pedido.Mercearia;
using Business.Enum;
using Business.Forms;
using DevExpress.LookAndFeel;
using DevExpress.XtraBars.Helpers;
using DevExpress.XtraReports.UI;
using Ecf;
using Ecf.Forms;
using Remotion.Linq.Collections;
using Vendas.Forms;
using Vendas.Properties;
using Vendas.Reports;

namespace Vendas
{
    public partial class VendasMercearia : DevExpress.XtraEditors.XtraForm
    {
        private TipoBuscaProduto TipoBusca { get; set; }
        public VendasMercearia()
        {

            InitializeComponent();
            if (!EcfHelper.GetEcf().VerificaImpressora())
            {
                Process.GetCurrentProcess().Kill();
            }
            VerificaPermissoesIniciais();
            cmdFechar.Glyph = Resources.concluir;
            cmdCancelarPedido.Glyph = Resources.cancelarPedido;
            cmdReceberPagamento.Glyph = Resources.cotacoes;
            cmdExtratoCliente.Glyph = Resources.notaFiscalEntrada;
            cmdSair.Glyph = Resources.fecharApp;
            SkinHelper.InitSkinGallery(skinGalleryBarItem, true);
            DevExpress.LookAndFeel.UserLookAndFeel.Default.StyleChanged += Default_StyleChanged;
            NovoPedido();
            filtroTextEdit.Focus();
            var l = LancamentoInicialRepository.DiaLancado(Utils.Terminal.ConfiguracaoEcf.Caixa);
            if (l == null)
            {
                new FormLancamentoInicial().ShowDialog();
            }
        }

        private void VerificaPermissoesIniciais()
        {
            if (!Utils.Terminal.MerceariaAtivo)
            {
                MessageBox.Show("Este terminal não está habilitado para funcionar com" +
                                " o módulo de vendas.");
                Process.GetCurrentProcess().Kill();
            }
            if (Utils.Terminal.ConfiguracaoEcf == null)
            {
                MessageBox.Show("O ECF não foi configurado para este terminal.");
                Process.GetCurrentProcess().Kill();
            }
            if (!Utils.UsuarioAtual.UsaVendaMercearia)
            {
                MessageBox.Show("Este usuário não tem acesso a este módulo.");
                Process.GetCurrentProcess().Kill();
            }
        }

        void Default_StyleChanged(object sender, EventArgs e)
        {
            Properties.Settings.Default.Skin = UserLookAndFeel.Default.SkinName;
            Properties.Settings.Default.Save();
        }

        private void textEdit1_KeyUp(object sender, KeyEventArgs e)
        {


        }

        private void LimparCampo()
        {
            filtroTextEdit.Text = "";
            txtQuantidade.Text = "1";
        }

       

        private void AddProduto(Produto produto)
        {
            if (produto == null)
            {
                return;
            }

            Mercearia m = (Mercearia)merceariaBindingSource.DataSource;

            // Cria um novo produto e passa para a lista de produtos.
            var prod = ProdutoPedidoRepository.CreateProdutoPedido(produto,
                Convert.ToDecimal(txtQuantidade.Text));

            prod.Sequencia = GetLastSequencia();
            
            // Seta novamente o valor no bindingSource para poder exibir dos dados.
            produtosBindingSource.Add(prod);
            produtosBindingSource.EndEdit();
            produtosGridControl.Refresh();
            LimparCampo();

        }

        private int GetLastSequencia()
        {
            int sq = 1;
            foreach (ProdutoPedido prod in produtosBindingSource)
            {
                if (prod.Sequencia > sq)
                {
                    sq = prod.Sequencia + 1;
                }
            }
            return sq;
        }

        private void NovoPedido()
        {
            try
            {
                var m = new Mercearia();
                m.DataPedido = Utils.Configuracao.DiaProcessamento;
                m.Cliente = MerceariaRepository.
                    GetSession().Get<Pessoa>(Utils.Configuracao.PessoaPadrao.Id);
                m.Produtos = new ObservableCollection<ProdutoPedido>();
                produtosBindingSource.DataSource = m.Produtos;
                merceariaBindingSource.DataSource = m;
                LimparCampo();
                filtroTextEdit.Focus();

            }
            catch (Exception ex)
            {
                MessageBox.Show("Não foi possível iniciar a aplicação," +
                                " verifique as configurações e tente novamente.\n" +
                                "Mensagem de erro: " + ex.InnerException);
                Process.GetCurrentProcess().Kill();
            }

        }

        private void txtQuantidade_KeyUp(object sender, KeyEventArgs e)
        {



        }

        private void cmdFinalizar_Click(object sender, System.EventArgs e)
        {
            FinalizarPedido();
        }

        private void FinalizarPedido()
        {
            Mercearia m = (Mercearia)merceariaBindingSource.DataSource;
            VendaUtils.FecharPedidoMercearia(m);
            NovoPedido();
        }

        private void cmdCancelar_Click(object sender, EventArgs e)
        {
            CancelarPedido();
        }

        private void CancelarPedido()
        {
            NovoPedido();
        }

        private void simpleButton6_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        private void filtroTextEdit_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.Enter)
            {
                IList<Produto> prods;
                if (filtroTextEdit.Text == "")
                {
                    txtQuantidade.Focus();
                    return;
                }
                //if (TipoBusca == TipoBuscaProduto.Descricao)
                //{
                //    string param = "%" + filtroTextEdit.Text + "%";
                //    IList<Produto> list = ProdutoRepositorio.GetList(Restrictions.InsensitiveLike("Descricao", param));

                //    SelecionaProduto(list);
                //    LimparCampo();
                //}
                switch (TipoBusca)
                {
                    case TipoBuscaProduto.Descricao:
                        AddProduto(Bonesoft.WindowsControls.Utils.Functions.SelecionaProduto(ProdutoRepository.GetByDescricao(filtroTextEdit.Text)));
                        break;
                    case TipoBuscaProduto.Referencia:
                        AddProduto(Bonesoft.WindowsControls.Utils.Functions.SelecionaProduto(ProdutoRepository.GetByReferencia(filtroTextEdit.Text)));
                        break;
                    case TipoBuscaProduto.CodBarra:
                        AddProduto(Bonesoft.WindowsControls.Utils.Functions.SelecionaProduto(ProdutoRepository.GetByCodBarra(filtroTextEdit.Text)));
                        break;
                }
            }
            if (e.KeyData == Keys.Down)
            {
                produtosBindingSource.MoveNext();
            }
            if (e.KeyData == Keys.Up)
            {
                produtosBindingSource.MovePrevious();
            }
            if (e.KeyData == Keys.Delete)
            {
                produtosBindingSource.Remove(produtosBindingSource.Current);
            }
            if (e.KeyData == (Keys.Control | Keys.D))
            {
                TipoBusca = TipoBuscaProduto.Descricao;
            }
            if (e.KeyData == (Keys.Control | Keys.R))
            {
                TipoBusca = TipoBuscaProduto.Referencia;
            }
            if (e.KeyData == (Keys.Control | Keys.B))
            {
                TipoBusca = TipoBuscaProduto.CodBarra;
            }
        }

        private void txtQuantidade_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.Enter)
            {
                if (txtQuantidade.Text == "")
                {
                    txtQuantidade.Text = "1";
                }
                filtroTextEdit.Focus();
            }
        }

        private void Inicial_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyData)
            {
                case Keys.End:
                    FinalizarPedido();
                    break;
                case Keys.F11:
                    break;
                case Keys.F12:
                    break;
                case Keys.F3:
                    CancelarPedido();
                    break;
            }
        }

        private void cmdConfiguracoes_Click(object sender, EventArgs e)
        {
            new FormConfigBusiness().ShowDialog();
        }

        private void cmdRelacaoVendas_Click(object sender, EventArgs e)
        {
            new RelVendas().ShowPreviewDialog();
        }

        private void cmdSuprimento_Click(object sender, EventArgs e)
        {

        }

        private void cmdPagCliente_Click(object sender, EventArgs e)
        {

        }

        private void cmdBuscaProdDescricao_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            TipoBusca = TipoBuscaProduto.Descricao;
            filtroLabel.Text = "Descrição";
        }

        private void cmdBuscaProdCodBarra_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            TipoBusca = TipoBuscaProduto.Descricao;
            filtroLabel.Text = "Código de barras";
        }

        private void cmdBuscaProdReferencia_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            TipoBusca = TipoBuscaProduto.Descricao;
            filtroLabel.Text = "Referência";
        }

        private void cmdFechar_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            try
            {

                var pedido = (Mercearia)merceariaBindingSource.DataSource;

                if (!VendaUtils.FecharPedidoMercearia(pedido))
                {
                    return;
                }
                NovoPedido();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro ao gravar pedido.\n" +
                                "Mensagem do erro: " + ex.Message + "\n" + ex.InnerException);

            }
        }

        private void skinGalleryBarItem_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            Properties.Settings.Default.Skin = UserLookAndFeel.Default.SkinName;
            Properties.Settings.Default.Save();
        }

        private void skinGalleryBarItem_GalleryItemClick(object sender, DevExpress.XtraBars.Ribbon.GalleryItemClickEventArgs e)
        {
            Properties.Settings.Default.Skin = UserLookAndFeel.Default.SkinName;
            Properties.Settings.Default.Save();
        }

        private void cmdCancelarPedido_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            NovoPedido();
        }

        private void cmdSair_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            Close();
        }

        private void cmdReceberPagamento_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            new FormPagamentoCliente().ShowDialog();
        }

        private void cmdSuprimento_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            new FormSuprimento().ShowDialog();
        }

        private void cmdSangria_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            new FormSangria().ShowDialog();
        }

        private void cmdFechamento_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {

            new FormFechamento().ShowDialog();

        }

        private void cmdMenuFiscal_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            new FormMenuFiscal(FormMenuFiscal.MenuFiscalTipo.Mercearia).ShowDialog();
        }

    }




}